# -*- coding: utf-8 -*-
# 数据加载与处理模块

import pandas as pd
import os
import logging

def validate_excel_sheet(file_path, sheet_name):
    """验证Excel文件中的表格是否存在"""
    try:
        # 直接尝试读取指定表格的前1行
        # 如果表格不存在，这里会抛出异常
        data = pd.read_excel(file_path, sheet_name=sheet_name, nrows=1)
        return True, None
    except ValueError as e:
        if "Worksheet named" in str(e) and "not found" in str(e):
            # 获取可用的表格名称
            try:
                xl = pd.ExcelFile(file_path)
                sheet_names = xl.sheet_names
                return False, f"表格'{sheet_name}'不存在。可用的表格: {', '.join(sheet_names)}"
            except:
                return False, f"表格'{sheet_name}'不存在，且无法读取可用表格列表。"
        return False, f"验证表格失败: {str(e)}"
    except Exception as e:
        return False, f"验证表格时发生错误: {str(e)}"

def get_excel_sheet_names(file_path):
    """获取Excel文件中的所有表格名称"""
    try:
        if not os.path.exists(file_path):
            return None, f"文件不存在: {file_path}"
        
        if not file_path.lower().endswith(('.xlsx', '.xls')):
            return None, f"不是有效的Excel文件: {file_path}"
            
        # 使用pandas读取所有表格名
        xl = pd.ExcelFile(file_path)
        sheet_names = xl.sheet_names
        
        if not sheet_names:
            return None, f"Excel文件中不包含任何表格: {file_path}"
            
        return sheet_names, None
    except Exception as e:
        return None, f"读取Excel表格名失败: {str(e)}"

def load_excel_data(file_path, sheet_name='Sheet1'):
    """加载Excel数据文件"""
    try:
        if not os.path.exists(file_path):
            return None, f"文件不存在: {file_path}"
        
        # 检查文件是否为Excel文件
        if not file_path.lower().endswith(('.xlsx', '.xls')):
            return None, f"不是有效的Excel文件: {file_path}"
        
        # 严格验证表格名是否存在
        is_valid, error_msg = validate_excel_sheet(file_path, sheet_name)
        if not is_valid:
            return None, error_msg
        
        # 使用严格模式加载数据，确保表格名必须完全匹配
        try:
            data = pd.read_excel(file_path, sheet_name=sheet_name)
        except ValueError as e:
            return None, f"读取表格'{sheet_name}'失败: {str(e)}"
        
        # 检查必要的列是否存在
        required_columns = ['hostname', 'IP', 'role']
        missing_columns = [col for col in required_columns if col not in data.columns]
        if missing_columns:
            return None, f"缺少必要的列: {', '.join(missing_columns)}"
        
        return data, None
    except Exception as e:
        return None, f"加载Excel文件失败: {str(e)}"

def load_csv_data(file_path):
    """加载CSV数据文件"""
    try:
        if not os.path.exists(file_path):
            return None, f"文件不存在: {file_path}"
        
        # 加载数据
        data = pd.read_csv(file_path)
        
        # 检查必要的列是否存在
        required_columns = ['hostname', 'IP', 'role']
        missing_columns = [col for col in required_columns if col not in data.columns]
        if missing_columns:
            return None, f"缺少必要的列: {', '.join(missing_columns)}"
        
        return data, None
    except Exception as e:
        return None, f"加载CSV文件失败: {str(e)}"

def convert_to_records(data):
    """将DataFrame转换为记录字典列表"""
    if data is None:
        return []
    return data.to_dict(orient='records')

def validate_data(data, required_fields=None):
    """验证数据是否包含所需字段"""
    if data is None or len(data) == 0:
        return False
    
    if required_fields:
        sample = data[0] if len(data) > 0 else {}
        for field in required_fields:
            if field not in sample:
                print(f"缺少必需字段: {field}")
                return False
    
    return True 

def validate_excel_sheet(file_path, sheet_name):
    """验证Excel文件中的表格是否存在"""
    try:
        # 直接尝试读取指定表格的前1行
        # 如果表格不存在，这里会抛出异常
        data = pd.read_excel(file_path, sheet_name=sheet_name, nrows=1)
        return True, None
    except ValueError as e:
        if "Worksheet named" in str(e) and "not found" in str(e):
            # 获取可用的表格名称
            try:
                xl = pd.ExcelFile(file_path)
                sheet_names = xl.sheet_names
                return False, f"表格'{sheet_name}'不存在。可用的表格: {', '.join(sheet_names)}"
            except:
                return False, f"表格'{sheet_name}'不存在，且无法读取可用表格列表。"
        return False, f"验证表格失败: {str(e)}"
    except Exception as e:
        return False, f"验证表格时发生错误: {str(e)}" 